package com.itheima.springbootwebtlias.aspect;

import com.itheima.springbootwebtlias.mapper.EmpLoginLogMapper;
import com.itheima.springbootwebtlias.pojo.Emp;
import com.itheima.springbootwebtlias.pojo.EmpLoginLog;
import com.itheima.springbootwebtlias.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

import java.util.Map;
/**
 * 记录当前 tlias 智能学习辅助系统中所有员工的登录操作 （切入点：execution(....);
 * 通知类型：@Around） ，无论登录成功还是失败，都需要记录日志。
 */


@Slf4j
@Aspect
@Component
public class EmpLoginLogAspect {
    @Autowired
    private EmpLoginLogMapper empLoginLogMapper;

    // 环绕通知
    // 切入点表达式：只需要对一个方法进行增强 建议使用execution
    @Around("execution(* com.itheima.springbootwebtlias.controller.LoginController.login(com.itheima.springbootwebtlias.pojo.Emp))")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        //a 获取目标方法执行耗时
        // 记录开始时间
        long startTime = System.currentTimeMillis();
        Object result = null;
        long costTime;
        try {
            // 执行 目标方法开始
            result = pjp.proceed();
            // 执行 目标方法结束
        } catch (Throwable e) {
            result = Result.error(e.getMessage()); //异常情况，自行构建异常对象
        } finally {
            long endTime = System.currentTimeMillis();
            costTime = endTime - startTime;
        }

        //b.获取令牌，获取目标方法login登录结果，从Result中获取令牌
        Result result1 = (Result) result;
        Map map = (Map) result1.getData(); // 获取result的data数据
        String token = "";
        if (map != null) {
            token = (String) map.get("token");
        }
        //c. 获取登录结果：获取目标方法login登录结果
        int code = result1.getCode();
        short isSuccess = (short) code;

        //d.获取请求参数，通过连接点对象ProceedingJoinPoint 获取目标方法参数
        Emp emp = (Emp) pjp.getArgs()[0]; //目标方法只有一个参数：Emp

        // 定义日志对象：收集操作日志信息
        EmpLoginLog eLL = new EmpLoginLog();
        //通过连接点对象ProceedingJoinPoint 获取目标方法信息
        eLL.setId(emp.getId()); // 获取操作人id
        eLL.setUsername(emp.getUsername());// 获取操作人名字
        eLL.setPassword(emp.getPassword()); // 获取登录密码
        eLL.setLoginTime(LocalDateTime.now());// 获取登录时间
        eLL.setIsSuccess(isSuccess); // 获取登录是否成功信息
        eLL.setJwt(token); //  获取jwt
        eLL.setCostTime(costTime); //  获取耗时


        // 插入日志
        empLoginLogMapper.insert(eLL);
        return result;
    }
}
